package com.example.cloudcity.servlet;

import jakarta.servlet.ServletException; // 导入ServletException类，用于处理Servlet异常
import jakarta.servlet.annotation.WebServlet; // 导入WebServlet注解，用于定义Servlet
import jakarta.servlet.http.HttpServlet; // 导入HttpServlet类，作为Servlet的基类
import jakarta.servlet.http.HttpServletRequest; // 导入HttpServletRequest类，用于处理请求
import jakarta.servlet.http.HttpServletResponse; // 导入HttpServletResponse类，用于处理响应
import com.google.gson.Gson; // 导入Gson类，用于处理JSON
import com.google.gson.JsonObject; // 导入JsonObject类，用于处理JSON对象

import java.io.IOException; // 导入IOException类，用于处理输入输出异常
import java.sql.*; // 导入SQL相关类
import java.util.ArrayList; // 导入ArrayList类，用于存储日志列表
import java.util.HashMap; // 导入HashMap类，用于存储日志信息
import java.util.List; // 导入List接口，用于定义日志列表
import java.util.Map; // 导入Map接口，用于定义日志信息的映射

@WebServlet("/LogManageServlet") // 定义Servlet的URL映射
public class LogManageServlet extends HttpServlet {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/game"; // 数据库URL
    private static final String USER = "root"; // 数据库用户名
    private static final String PASS = "1234"; // 数据库密码

    // 处理GET请求
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("application/json;charset=UTF-8"); // 设置响应内容类型为JSON
        String action = request.getParameter("action"); // 获取请求参数中的action

        try {
            switch (action) {
                case "list": // 如果action为list，调用listLogs方法
                    listLogs(request, response);
                    break;
                default: // 处理未知操作
                    sendError(response, "Unknown action: " + action);
            }
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常堆栈
            sendError(response, e.getMessage()); // 返回错误信息
        }
    }

    // 列出日志
    private void listLogs(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, IOException {
        String startDate = request.getParameter("startDate"); // 获取开始日期
        String endDate = request.getParameter("endDate"); // 获取结束日期
        String searchText = request.getParameter("searchText"); // 获取搜索文本

        List<Map<String, Object>> logs = new ArrayList<>(); // 创建日志列表
        StringBuilder sql = new StringBuilder("SELECT * FROM operation_logs WHERE 1=1"); // SQL查询语句

        // 根据请求参数构建SQL查询
        if (startDate != null && !startDate.isEmpty()) {
            sql.append(" AND DATE(created_at) >= ?"); // 添加开始日期条件
        }
        if (endDate != null && !endDate.isEmpty()) {
            sql.append(" AND DATE(created_at) <= ?"); // 添加结束日期条件
        }
        if (searchText != null && !searchText.isEmpty()) {
            sql.append(" AND (operation_content LIKE ? OR username LIKE ? OR operation_type LIKE ?)"); // 添加搜索条件
        }
        sql.append(" ORDER BY created_at DESC"); // 按创建时间降序排列

        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); // 获取数据库连接
             PreparedStatement stmt = conn.prepareStatement(sql.toString())) { // 准备SQL语句
            
            int paramIndex = 1; // 参数索引
            // 设置SQL语句中的参数
            if (startDate != null && !startDate.isEmpty()) {
                stmt.setString(paramIndex++, startDate); // 设置开始日期参数
            }
            if (endDate != null && !endDate.isEmpty()) {
                stmt.setString(paramIndex++, endDate); // 设置结束日期参数
            }
            if (searchText != null && !searchText.isEmpty()) {
                String searchPattern = "%" + searchText + "%"; // 构建搜索模式
                stmt.setString(paramIndex++, searchPattern); // 设置搜索内容参数
                stmt.setString(paramIndex++, searchPattern); // 设置用户名参数
                stmt.setString(paramIndex, searchPattern); // 设置操作类型参数
            }

            ResultSet rs = stmt.executeQuery(); // 执行查询
            while (rs.next()) { // 遍历结果集
                Map<String, Object> log = new HashMap<>(); // 创建日志信息映射
                log.put("id", rs.getLong("id")); // 获取日志ID
                log.put("operation_type", rs.getString("operation_type")); // 获取操作类型
                log.put("operation_content", rs.getString("operation_content")); // 获取操作内容
                log.put("username", rs.getString("username")); // 获取用户名
                log.put("ip_address", rs.getString("ip_address")); // 获取IP地址
                log.put("created_at", rs.getTimestamp("created_at").toString()); // 获取创建时间
                log.put("result", rs.getString("result")); // 获取操作结果
                logs.add(log); // 将日志信息添加到列表
            }
        }

        String jsonResponse = new Gson().toJson(logs); // 将日志列表转换为JSON格式
        response.getWriter().write(jsonResponse); // 返回JSON响应
    }

    // 发送错误信息
    private void sendError(HttpServletResponse response, String message) throws IOException {
        JsonObject json = new JsonObject(); // 创建JSON对象
        json.addProperty("error", message); // 设置错误消息
        response.getWriter().write(json.toString()); // 返回错误响应
    }
}
